/* 
泛型接口
*/

 /* 
  1. 声明泛型类型: 在接口名的右侧  <T>   // T K V
  2. 使用泛型: 接口体中
  3. 指定泛型的具体类型: 定义实现时, 接口名的右侧 <具体类型>
  */

(() => {
  interface BaseCRUD<T> {
    data: T[]
    add (t: T): number // 返回内部生成的id
    getById (id: number): T
  }

  // 定义User类
  class User {
    name: string
    age: number
    id?: number

    constructor (name, age) {
      this.name = name
      this.age = age
    }
  } 

  // 定义操作User对象数据的类
  class UserCRUD implements BaseCRUD<User> {
    data: User[] = []

    add (user: User): number {
      const id = Date.now()
      user.id = id
      this.data.push(user)
      return id
    }
    getById (id: number): User {
      return this.data.find(user => user.id===id)
    }
  }

  const userCRUD = new UserCRUD()
  const id = userCRUD.add(new User('Tom', 21))
  userCRUD.add(new User('Jack', 22))
  console.log(userCRUD.getById(id))
  console.log(userCRUD.data)

})()